服务调用OpenFeign

您所在的位置:网站首页 openfeign get请求 服务调用OpenFeign

服务调用OpenFeign

2023-06-22 03:57| 来源: 网络整理| 查看: 265

OpenFeign OpenFeign 介绍OpenFeign 的使用OpenFeign 参数传递OpenFeign 超时控制OpenFeign 日志设置OpenFeign 的工作流程

OpenFeign 介绍

Feign 是 SpringCloud组件中一个轻量级RESTful的HTTP服务客户端,Feign集成了Ribbon、RestTemplate 实现了负载均衡的执行Http调用,对原有的方式(Ribbon+RestTemplate)进行了封装,对远程调用进行了简化,更加符合面向接口编程。 OpenFeign 是 springcloud 在 Feign 的基础上支持了 SpringMVC 的注解,如 @RequestMapping等。OpenFeign的 @FeignClient 可以解析 SpringMVC的 @RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

请添加图片描述

OpenFeign 的使用

服务的消费者远程调用服务的提供者提供的接口,在服务的消费者中引入 OpenFeign 的依赖。

org.springframework.cloud spring-cloud-starter-openfeign

在启动类上添加注解@EnableFeignClients,开启openFeign功能。

@SpringBootApplication @EnableFeignClients public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } }

编写接口,使用@FeignClient注解。value 属性指定了服务提供者在注册中心的服务名。

@FeignClient(value = "userservice") public interface UserClient { @GetMapping("/user/{id}") User findById(@PathVariable("id") Long id); }

服务提供者接口程序,FeignClient 的请求路径,方式和参数要和被调用的服务路径保持一致。

@RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public User queryById(@PathVariable("id") Long id) { return userService.queryById(id); } }

通过以上的配置,服务的消费者通过@FeignClient声明接口,就可以像调用本地方法一样,调用远程服务。

@Service public class OrderService { @Autowired private OrderMapper orderMapper; @Autowired private UserClient userClient; public Order queryOrderById(Long orderId) { // 1.查询订单 Order order = orderMapper.findById(orderId); // 2.用Feign远程调用 User user = userClient.findById(order.getUserId()); // 3.封装user到Order order.setUser(user); // 4.返回 return order; } } OpenFeign 参数传递

传递JSON数据,通过@RequestBody标识入参。

@FeignClient(value = "openFeign-provider") public interface OpenFeignService { /** * 参数默认是 @RequestBody 标注的,这里的 @RequestBody 可以不填 * 方法名称任意 */ @PostMapping("/openfeign/provider/order") Order createOrder(@RequestBody Order order); }

POJO表单传参,参数使用POJO对象接收。openFeign提供了一个注解@SpringQueryMap完美解决POJO表单传参。

@FeignClient(value = "openFeign-provider") public interface OpenFeignService { /** * 参数默认是@RequestBody标注的,如果通过POJO对象传参的,使用@SpringQueryMap标注 */ @PostMapping("/openfeign/provider/order") Order createOrder(@SpringQueryMap Order order); }

URL中携带参数,此种方式针对restful方式中的GET请求。注解@PathVariable接收url中的占位符。

@FeignClient(value = "openFeign-provider") public interface OpenFeignService { @GetMapping("/openfeign/provider/test/{id}") String get(@PathVariable("id")Integer id); }

普通表单参数,此种方式传参不建议使用

@FeignClient(value = "openFeign-provider") public interface OpenFeignService { /** * 必须要@RequestParam注解标注,且value属性必须填上参数名 * 方法参数名可以任意,但是@RequestParam注解中的value属性必须和provider中的参数名相同 */ @PostMapping("/openfeign/provider/test") String test(@RequestParam("id") String arg1, @RequestParam("name") String arg2); } OpenFeign 超时控制

Feign客户端调用远程接口时,默认会等待1秒钟,如果服务端处理,超过1秒钟则会报错。 可以在 application.yaml 配置文件中设置超时时长。

#设置feign客户端超时时间(OpenFeign默认支持ribbon) ribbon: # 表示建立连接后从服务器读取到可用资源,所用时间 ReadTimeout: 5000 # 表示建立连接时间,适用于网络正常的情况下,两端连接所用时间 ConnectTimeout: 5000 OpenFeign 日志设置

通过日志可以对 Feign 接口的调用情况进行监控和输出。通过配置,调整日志级别,从而了解 Feign 中 Http 请求的细节。openFeign 默认是不显示任何日志的。

openFeign的日志级别如下:

NONE:默认的,不显示任何日志BASIC:仅记录请求方法、URL、响应状态码及执行时间HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据

使用配置类,进行日志级别设置

import feign.Logger; import org.springframework.context.annotation.Bean; @Configuration public class FeignClientConfiguration{ @Bean public Logger.Level logLevel(){ return Logger.Level.FULL; } }

全局配置,在启动类设置。

@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)

局部配置,放到对应的接口类中。

@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class)

yaml 文件中设置接口日志级别

logging: level: com.feign.service: debug

com.feign.service 是 openFeign 接口所在的包名

使用配置文件设置日志级别

# 全局配置 feign: client: config: default: #这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置 loggerLevel: FULL #日志级别

局部配置

feign: client: config: userservice: #这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置 loggerLevel: FULL #日志级别 OpenFeign 的工作流程

OpenFeign 使用了一种动态代理技术来封装远程服务调用的过程,在上面的UserClient接口中已经对服务的名称、接口类型、访问路径已经通过注解做了声明。 OpenFeign 通过解析这些注解标签生成一个动态代理类,这个代理类会将接口调用转化为一个远程服务调用的 Request,并发送给目标服务。

OpenFeign 远程调用过程 请添加图片描述

从指定的目录下扫描并加载所有被 @FeignClient 注解修饰的接口。对每一个 FeignClient 接口生成一个动态代理对象,即图中的 FeignProxyService动态代理对象会被添加到 Spring 中,并注入到对应的服务里,也就是图中的 LocalService 服务LocalService 会发起底层方法调用。实际上这个方法调用会被 OpenFeign 生成的代理对象接管,由代理对象发起一个远程服务调用,并将调用的结果返回给 LocalService。


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3